
#include <gflags/gflags.h>
#include<gtest/gtest.h>
#include <stdexcept>
#include <vector>

#include "etcd.hpp"
#include "channel.hpp"
#include "logger.hpp"
#include "base.pb.h"
#include "user.pb.h"
#include "utils.hpp"

DEFINE_bool(run_mode, false, "程序的运行模式，false-调试； true-发布；");
DEFINE_string(log_file, "", "发布模式下，用于指定日志的输出文件");
DEFINE_int32(log_level, 0, "发布模式下，用于指定日志输出等级");

DEFINE_string(etcd_host, "http://127.0.0.1:2379", "服务注册中心地址");
DEFINE_string(base_service, "/service", "服务监控根目录");
DEFINE_string(user_service, "/service/user_service", "服务监控根目录");

xu::ServiceManage::ptr sm;

void RegisterReq(const std::string &nickname,const std::string &password)
{
    auto channel = sm->Choose(FLAGS_user_service);
    ASSERT_TRUE(channel);

    xu::UserService_Stub stub(channel.get());
    xu::UserRegisterReq req;
    xu::UserRegisterRsp rsp;
    brpc::Controller cntl;

    std::string uid = xu::uuid();
    req.set_request_id(uid);
    req.set_nickname(nickname);
    req.set_password(password);

    stub.UserRegister(&cntl,&req,&rsp,nullptr);
    ASSERT_EQ(cntl.Failed(),false);
    ASSERT_EQ(rsp.request_id(),uid);
    ASSERT_EQ(rsp.success(),true);

}

void Avatar(const std::string & uid,const std::string & avatar)
{
        //1.通过Rpc信道管理对象，获取提供Echo服务的信道
    auto channel = sm->Choose(FLAGS_user_service);
    ASSERT_TRUE(channel);

    xu::UserService_Stub stub(channel.get());
    xu::SetUserAvatarReq req;
    xu::SetUserAvatarRsp rsp;
    brpc::Controller cntl;

    req.set_request_id(xu::uuid());
    req.set_user_id(uid);
    req.set_avatar(avatar);

    stub.SetUserAvatar(&cntl,&req,&rsp,nullptr);
    ASSERT_EQ(cntl.Failed(),false);
    ASSERT_EQ(rsp.success(),true);
}

// TEST(模块用户测试,用户昵称注册)
// {
//     //1.通过Rpc信道管理对象，获取提供Echo服务的信道
//     auto channel = sm->Choose(FLAGS_user_service);
//     ASSERT_TRUE(channel);

//     xu::UserService_Stub stub(channel.get());
//     xu::UserRegisterReq req;
//     xu::UserRegisterRsp rsp;
//     brpc::Controller cntl;

//     std::string uid = xu::uuid();
//     req.set_request_id(uid);
//     req.set_nickname("lisi");
//     req.set_password("123456");

//     stub.UserRegister(&cntl,&req,&rsp,nullptr);
//     ASSERT_EQ(cntl.Failed(),false);
//     ASSERT_EQ(rsp.request_id(),uid);
//     ASSERT_EQ(rsp.success(),true);
// }
// std::string sid;
// TEST(模块用户测试,用户昵称登录)
// {
//     //1.通过Rpc信道管理对象，获取提供Echo服务的信道
//     auto channel = sm->Choose(FLAGS_user_service);
//     ASSERT_TRUE(channel);

//     xu::UserService_Stub stub(channel.get());
//     xu::UserLoginReq req;
//     xu::UserLoginRsp rsp;
//     brpc::Controller cntl;

//     std::string uid = xu::uuid();
//     req.set_request_id(uid);
//     req.set_nickname("lisi");
//     req.set_password("123456");

//     stub.UserLogin(&cntl,&req,&rsp,nullptr);
//     ASSERT_EQ(cntl.Failed(),false);
//     ASSERT_EQ(rsp.request_id(),uid);
//     ASSERT_EQ(rsp.success(),true);
//     sid =  rsp.login_session_id();
// }

// TEST(模块用户测试,用户签名修改)
// {
//     //1.通过Rpc信道管理对象，获取提供Echo服务的信道
//     auto channel = sm->Choose(FLAGS_user_service);
//     ASSERT_TRUE(channel);

//     xu::UserService_Stub stub(channel.get());
//     xu::SetUserDescriptionReq req;
//     xu::SetUserDescriptionRsp rsp;
//     brpc::Controller cntl;

//     std::string uid = xu::uuid();
//     req.set_request_id(uid);
//     req.set_user_id("f70f-18aad62f-0002");
//     req.set_description("我是李四");

//     stub.SetUserDescription(&cntl,&req,&rsp,nullptr);
//     ASSERT_EQ(cntl.Failed(),false);
//     ASSERT_EQ(rsp.request_id(),uid);
//     ASSERT_EQ(rsp.success(),true);
// }

// TEST(模块用户测试,用户昵称修改)
// {
//     //1.通过Rpc信道管理对象，获取提供Echo服务的信道
//     auto channel = sm->Choose(FLAGS_user_service);
//     ASSERT_TRUE(channel);

//     xu::UserService_Stub stub(channel.get());
//     xu::SetUserNicknameReq req;
//     xu::SetUserNicknameRsp rsp;
//     brpc::Controller cntl;

//     std::string uid = xu::uuid();
//     req.set_request_id(uid);
//     req.set_user_id("f70f-18aad62f-0002");
//     req.set_nickname("wangwu");

//     stub.SetUserNickname(&cntl,&req,&rsp,nullptr);
//     ASSERT_EQ(cntl.Failed(),false);
//     ASSERT_EQ(rsp.request_id(),uid);
//     ASSERT_EQ(rsp.success(),true);
// }

// TEST(模块用户测试,用户头像修改)
// {
//     //1.通过Rpc信道管理对象，获取提供Echo服务的信道
//     auto channel = sm->Choose(FLAGS_user_service);
//     ASSERT_TRUE(channel);

//     xu::UserService_Stub stub(channel.get());
//     xu::SetUserAvatarReq req;
//     xu::SetUserAvatarRsp rsp;
//     brpc::Controller cntl;

//     std::string uid = xu::uuid();
//     req.set_request_id(uid);
//     req.set_user_id("f70f-18aad62f-0002");
//     req.set_avatar("头像");

//     stub.SetUserAvatar(&cntl,&req,&rsp,nullptr);
//     ASSERT_EQ(cntl.Failed(),false);
//     ASSERT_EQ(rsp.request_id(),uid);
//     ASSERT_EQ(rsp.success(),true);
// }

// TEST(模块用户测试,用户信息获取)
// {
//     //1.通过Rpc信道管理对象，获取提供Echo服务的信道
//     auto channel = sm->Choose(FLAGS_user_service);
//     ASSERT_TRUE(channel);

//     xu::UserService_Stub stub(channel.get());
//     xu::GetUserInfoReq req;
//     xu::GetUserInfoRsp rsp;
//     brpc::Controller cntl;

//     std::string uid = xu::uuid();
//     req.set_request_id(uid);
//     req.set_user_id("f70f-18aad62f-0002");

//     stub.GetUserInfo(&cntl,&req,&rsp,nullptr);
//     ASSERT_EQ(cntl.Failed(),false);
//     ASSERT_EQ(rsp.request_id(),uid);
//     ASSERT_EQ(rsp.success(),true);
//     LOG_DEBUG("user_id : {}",rsp.user_info().user_id());
//     LOG_DEBUG("nickname : {}",rsp.user_info().nickname());
//     LOG_DEBUG("description : {}",rsp.user_info().description());
//     LOG_DEBUG("avatar : {}",rsp.user_info().avatar());
// }
// std::string cid;
// TEST(模块用户测试,验证码获取)
// {
//     //1.通过Rpc信道管理对象，获取提供Echo服务的信道
//     auto channel = sm->Choose(FLAGS_user_service);
//     ASSERT_TRUE(channel);

//     xu::UserService_Stub stub(channel.get());
//     xu::PhoneVerifyCodeReq req;
//     xu::PhoneVerifyCodeRsp rsp;
//     brpc::Controller cntl;

//     std::string uid = xu::uuid();
//     req.set_request_id(uid);
//     req.set_phone_number("17876721544");

//     stub.GetPhoneVerifyCode(&cntl,&req,&rsp,nullptr);
//     ASSERT_EQ(cntl.Failed(),false);
//     ASSERT_EQ(rsp.request_id(),uid);
//     ASSERT_EQ(rsp.success(),true);
//     cid = rsp.verify_code_id();
// }


// TEST(模块用户测试,手机号码注册)
// {
//     //1.通过Rpc信道管理对象，获取提供Echo服务的信道
//     auto channel = sm->Choose(FLAGS_user_service);
//     ASSERT_TRUE(channel);

//     xu::UserService_Stub stub(channel.get());
//     xu::PhoneRegisterReq req;
//     xu::PhoneRegisterRsp rsp;
//     brpc::Controller cntl;

//     std::string uid = xu::uuid();
//     req.set_request_id(uid);
//     req.set_phone_number("17876721544");
//     req.set_verify_code_id(cid);
//     req.set_verify_code("1111");

//     stub.PhoneRegister(&cntl,&req,&rsp,nullptr);
//     ASSERT_EQ(cntl.Failed(),false);
//     ASSERT_EQ(rsp.request_id(),uid);
//     ASSERT_EQ(rsp.success(),true);
// }

// TEST(模块用户测试,手机号码登录)
// {
//     //1.通过Rpc信道管理对象，获取提供Echo服务的信道
//     auto channel = sm->Choose(FLAGS_user_service);
//     ASSERT_TRUE(channel);

//     xu::UserService_Stub stub(channel.get());
//     xu::PhoneLoginReq req;
//     xu::PhoneLoginRsp rsp;
//     brpc::Controller cntl;

//     std::string uid = xu::uuid();
//     req.set_request_id(uid);
//     req.set_phone_number("17876721534");
//     req.set_verify_code_id(cid);
//     req.set_verify_code("1111");

//     stub.PhoneLogin(&cntl,&req,&rsp,nullptr);
//     ASSERT_EQ(cntl.Failed(),false);
//     ASSERT_EQ(rsp.request_id(),uid);
//     ASSERT_EQ(rsp.success(),true);
// }
// std::string cid1;
// TEST(模块用户测试,验证码获取1)
// {
//     //1.通过Rpc信道管理对象，获取提供Echo服务的信道
//     auto channel = sm->Choose(FLAGS_user_service);
//     ASSERT_TRUE(channel);

//     xu::UserService_Stub stub(channel.get());
//     xu::PhoneVerifyCodeReq req;
//     xu::PhoneVerifyCodeRsp rsp;
//     brpc::Controller cntl;

//     std::string uid = xu::uuid();
//     req.set_request_id(uid);
//     req.set_phone_number("17876721554");

//     stub.GetPhoneVerifyCode(&cntl,&req,&rsp,nullptr);
//     ASSERT_EQ(cntl.Failed(),false);
//     ASSERT_EQ(rsp.request_id(),uid);
//     ASSERT_EQ(rsp.success(),true);
//     cid1 = rsp.verify_code_id();
// }

// TEST(模块用户测试,手机号码修改)
// {
//     //1.通过Rpc信道管理对象，获取提供Echo服务的信道
//     auto channel = sm->Choose(FLAGS_user_service);
//     ASSERT_TRUE(channel);

//     xu::UserService_Stub stub(channel.get());
//     xu::SetUserPhoneNumberReq req;
//     xu::SetUserPhoneNumberRsp rsp;
//     brpc::Controller cntl;

//     std::string uid = xu::uuid();
//     req.set_request_id(uid);
//     req.set_user_id("ebaf-30d3b45b-0001");
//     req.set_phone_number("17876721554");
//     req.set_phone_verify_code_id(cid1);
//     req.set_phone_verify_code("1111");

//     stub.SetUserPhoneNumber(&cntl,&req,&rsp,nullptr);
//     ASSERT_EQ(cntl.Failed(),false);
//     ASSERT_EQ(rsp.request_id(),uid);
//     ASSERT_EQ(rsp.success(),true);
// }

// TEST(模块用户测试,多用户获取)
// {
//     //1.通过Rpc信道管理对象，获取提供Echo服务的信道
//     auto channel = sm->Choose(FLAGS_user_service);
//     ASSERT_TRUE(channel);

//     xu::UserService_Stub stub(channel.get());
//     xu::GetMultiUserInfoReq req;
//     xu::GetMultiUserInfoRsp rsp;
//     brpc::Controller cntl;

//     std::string uid = xu::uuid();
//     req.set_request_id(uid);
//     req.add_users_id("ebaf-30d3b45b-0001");
//     req.add_users_id("1419-a16d2da3-0003");

//     stub.GetMultiUserInfo(&cntl,&req,&rsp,nullptr);
//     ASSERT_EQ(cntl.Failed(),false);
//     ASSERT_EQ(rsp.request_id(),uid);
//     ASSERT_EQ(rsp.success(),true);

//     auto map = rsp.users_info();
//     LOG_DEBUG("user_id : {} ",map["ebaf-30d3b45b-0001"].user_id());
//     LOG_DEBUG("phone : {} ",map["ebaf-30d3b45b-0001"].phone());

//     LOG_DEBUG("user_id : {} ",map["1419-a16d2da3-0003"].user_id());
//     LOG_DEBUG("phone : {} ",map["1419-a16d2da3-0003"].phone());
//     // for(int i = 0; i < file_ids.size(); ++i)
//     // {
//     //     ASSERT_TRUE(map.find(file_ids[i]) !=  map.end());
//     //     auto file_data = map[file_ids[i]];
//     //     ASSERT_EQ(xu::WriteFile(file_data.file_id(),file_data.file_content()),true);
//     // }
// }

int main(int argc, char *argv[])
{   
    google::ParseCommandLineFlags(&argc, &argv, true);
    InitLog(FLAGS_run_mode,FLAGS_log_file,FLAGS_log_level);
    testing::InitGoogleTest(&argc,argv);

    //1. 先构造Rpc信道管理对象
    sm = std::make_shared<xu::ServiceManage>();
    sm->AddFollow(FLAGS_user_service);
    auto put_cb = std::bind(&xu::ServiceManage::onServiceOnline, sm.get(), std::placeholders::_1, std::placeholders::_2);
    auto del_cb = std::bind(&xu::ServiceManage::onServiceOffline, sm.get(), std::placeholders::_1, std::placeholders::_2);
    //2. 构造服务发现对象
    xu::Discovery::ptr dclient = std::make_shared<xu::Discovery>(FLAGS_etcd_host, FLAGS_base_service, put_cb, del_cb);
    RegisterReq("aaaa","123456");
    RegisterReq("bbb","123456");

    // std::string s1,s2;
    // cin>>s1>>s2;
    // Avatar(s1,"zhangsan 的头像");
    // Avatar(s2,"laoliu 的头像");
    return 0;
}
